package com.rui.state.main;

import com.rui.state.obj.CloseState;
import com.rui.state.model.Context;

/**
 * 状态模式（State Pattern）
 * <p>
 * <p>
 * 状态模式也称为状态机模式（State Machine Pattern），是允许对象在内部状态发生改变时改变它的行为，对象看起来好像修改了它的类。
 * <p>
 * 状态模式包含以下主要角色：
 * 环境（Context）角色：也称为上下文，它定义了客户程序需要的接口，维护一个当前状态，并将与状态相关的操作委托给当前状态对象来处理。
 * 抽象状态（State）角色：定义一个接口，用以封装环境对象中的特定状态所对应的行为。
 * 具体状态（Concrete State）角色：实现抽象状态所对应的行为。
 * <p>
 * <p>
 * 适用场景：
 * 行为随状态改变而改变的场景。
 * 一个操作中含有庞大的多分支结构，并且这些分支取决于对象的状态。
 * <p>
 * 优点：
 * 结构清晰：将状态独立为类，消除了冗余的if...else或switch...case语句，使代码更加简洁，提高系统可维护性。
 * 将状态转换显示化：通常的对象内部都是使用数值类型来定义状态，状态的切换是通过赋值进行表现，不够直观；而使用状态类，在切换状态时，是以不同的类进行表示，转换目的更加明确。
 * 状态类职责明确且具备扩展性。
 * <p>
 * 缺点：
 * 类膨胀：如果一个事物具备很多状态，则会造成状态类太多。
 * 状态模式的结构与实现都较为复杂，如果使用不当将导致程序结构和代码的混乱。
 * 状态模式对开闭原则的支持并不太好，对于可以切换状态的状态模式，增加新的状态类需要修改那些负责状态转换的源代码，否则无法切换到新增状态，而且修改某个状态类的行为也需修改对应类的源代码。
 *
 * @author ZhangRui
 * @date 2023/03/03 15:32
 **/
public class Main {

    public static void main(String[] args) {
        Context context = new Context();
        context.setLiftState(new CloseState());
        //电梯门打开了
        //电梯门关闭了!
        //电梯正在运行...
        //电梯停止了!
        context.open();
        context.close();
        context.run();
        context.stop();
    }
}
